package psmanager;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.TimeZone;

import javax.swing.JFrame;
import javax.swing.SwingUtilities;

import psmanager.db.DBManager;
import psmanager.db.types.Adresa;
import psmanager.db.types.Aktivnost;
import psmanager.db.types.AlkoholiziranaVoznja;
import psmanager.db.types.Bolest;
import psmanager.db.types.ConsolePrinter;
import psmanager.db.types.Cuvar;
import psmanager.db.types.Doktor;
import psmanager.db.types.Dosje;
import psmanager.db.types.EOruzje;
import psmanager.db.types.Kazna;
import psmanager.db.types.MedicinskiKarton;
import psmanager.db.types.Mjesto;
import psmanager.db.types.NovcanaKazna;
import psmanager.db.types.Osoba;
import psmanager.db.types.Pljacka;
import psmanager.db.types.Silovanje;
import psmanager.db.types.Ubojstvo;
import psmanager.db.types.Zatvorenik;
import psmanager.db.types.ZatvorskaKazna;
import psmanager.db.types.ZatvorskoKrilo;
import psmanager.swing.SwingMain;

public class PSMain {
	
	/**
	 * Main frame reference...
	 */
	public static JFrame mainFrame;
	
	public static void main(String[] args) {
		
		final DBManager dbm = new DBManager();
		
		loadDB2(dbm);
		
		loadGUI(dbm);
		
		// loadConsole(dbm);

	}

	@SuppressWarnings({ "unused", "unchecked" })
	private static void loadConsole(DBManager dbm) {
		
		System.out.print("\nDohvat svih ubojica...");
		ConsolePrinter.printHeader(new String[]{"Ime", "Prezime", "JMBG"});
		List<Zatvorenik> zatvorenici = dbm.grabAllCriminalsByRecord(new Ubojstvo());
		for (Zatvorenik zat : zatvorenici) {
			ConsolePrinter.printRow(new Object[]{zat.getIme(), zat.getPrezime(), zat.getJmbg()});
		}
		
		System.out.print("\nDohvat svih zatvorenika...");
		zatvorenici = (List<Zatvorenik>) dbm.grabAllByClass(Zatvorenik.class);
		ConsolePrinter.printHeader(new String[]{"Ime", "Prezime", "JMBG"});
		for (Zatvorenik zat : zatvorenici) {
			ConsolePrinter.printRow(new Object[]{zat.getIme(), zat.getPrezime(), zat.getJmbg()});
		}
		
		System.out.print("\nDohvat svih osoba koje zadovoljavaju kriterije...");
		List<Osoba> osobe = dbm.grabOsobeByAtrributes("0", "Zatvorenik", "J", "Dangubić", "Vukovarska", -1);
		ConsolePrinter.printHeader(new String[]{"Ime", "Prezime", "JMBG"});
		for (Osoba zat : osobe) {
			ConsolePrinter.printRow(new Object[]{zat.getIme(), zat.getPrezime(), zat.getJmbg()});
		}
	}

	private static void loadGUI(final DBManager dbm) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				mainFrame = new SwingMain(dbm);
				mainFrame.setVisible(true);
				// mainFrame.setExtendedState(mainFrame.getExtendedState() | JFrame.MAXIMIZED_BOTH);
			}
		});
	}

	private static void loadDB2(final DBManager dbm)
	{
		Mjesto mjestoZagreb = new Mjesto("Zagreb", 10000);
		Mjesto mjestoRijeka = new Mjesto("Rijeka", 51000);
		dbm.store(mjestoZagreb);
		
		// Doktor Pero Perić
		Adresa adresaDoktorPeric = new Adresa(mjestoZagreb, "Unska", "3");
		Date datumRodenjaDoktorPeric = datum("17-06-1963");

		Doktor doktorPeric = new Doktor("Pero", "Perić", "1706963004231", adresaDoktorPeric, datumRodenjaDoktorPeric, new MedicinskiKarton(), new Dosje(), "Opća praksa");
		dbm.store(doktorPeric);
		
		Doktor doktorGrgic = new Doktor("Grgo", "Grgić", "3107960441952", new Adresa(mjestoZagreb, "Ilica", "112"), "Kirurg");
		doktorGrgic.setRodjen(datum("31-7-1960"));
		dbm.store(doktorGrgic);
		
		// Doktor Mato Matić
		Adresa adresaDoktorMatic = new Adresa(mjestoZagreb, "Savska", "15");
		Date datumRodenjaDoktorMatic = datum("23-03-1961");

		Doktor doktorMatic = new Doktor("Mato", "Matić", "2302961032725", adresaDoktorMatic, datumRodenjaDoktorMatic, new MedicinskiKarton(), new Dosje(), "Opća praksa");

		dbm.store(doktorMatic);
		
		// Cuvar  Ivan Ivić
		
		Adresa adresaCuvarIvic = new Adresa(mjestoZagreb, "Kupska", "5");
		
		MedicinskiKarton kartonCuvarIvic = new MedicinskiKarton();
		kartonCuvarIvic.setOdgDoktor(doktorPeric);
		
		Cuvar cuvarIvic = new Cuvar("Ivan", "Ivić", "2204981442039", adresaCuvarIvic);
		cuvarIvic.setRodjen(datum("22-04-1981"));
		dbm.store(cuvarIvic);
		
		Cuvar cuvarPerec = new Cuvar("Denis", "Perec", "1501985398547", new Adresa(mjestoZagreb, "Zelinska", "4"));
		cuvarPerec.setRodjen(datum("15-01-1985"));
		dbm.store(cuvarPerec);
		
		// Krilo b2				
		
		ZatvorskoKrilo kriloB2 = new ZatvorskoKrilo(cuvarIvic, "B-2");
		dbm.store(kriloB2);
		
		
		// Zatvorenik Joza Dangubic
		
		Adresa adresaZatvorenikDangubic = new Adresa(mjestoZagreb, "Vukovarska", "57");
		
		MedicinskiKarton kartonDangubic = new MedicinskiKarton();
		kartonDangubic.setOdgDoktor(doktorMatic);
		kartonDangubic.dodajNovuBolest(new Bolest("Andol C", "Gripa", 1));
		
		Date datumOtvaranjaDangubic = datum("03-04-2009");

		
		Dosje dosjeDangubic = new Dosje();
		dosjeDangubic.setDatumOtvaranja(datumOtvaranjaDangubic);
		dosjeDangubic.dodajPrijestup(new AlkoholiziranaVoznja(adresaZatvorenikDangubic, "-", new ZatvorskaKazna(datumOtvaranjaDangubic, datumOtvaranjaDangubic, 1), "Obrađeno", 2d));
		
		dosjeDangubic.dodajPrijestup(new Ubojstvo());
		
		Zatvorenik zatvorenikDangubic = new Zatvorenik("Joža", "Dangubić", "2704965224512", adresaZatvorenikDangubic, "-");
		zatvorenikDangubic.setRodjen(datum("27-5-1965"));
		zatvorenikDangubic.setDosje(dosjeDangubic);
		dbm.store(zatvorenikDangubic);
		
		Zatvorenik zatvorenikBatina = new Zatvorenik("Pero", "Batina", "2211983123514", new Adresa(mjestoZagreb, "Ilica", "1"), "-");
		zatvorenikBatina.setRodjen(datum("22-11-1983"));
		dbm.store(zatvorenikBatina);
		
		Zatvorenik zatvorenikGrdic = new Zatvorenik("Grga", "Grdić", "3007969958603", new Adresa(mjestoRijeka, "Zagrebačka", "15"), "-");
		zatvorenikGrdic.setRodjen(datum("30-07-1963"));
		dbm.store(zatvorenikGrdic);
		
		Zatvorenik zatvorenikVucibatina = new Zatvorenik("Miki", "Vucibatina", "1102973264927", new Adresa(mjestoZagreb, "Zagrebačka", "22"), "-");
		zatvorenikVucibatina.setRodjen(datum("11-02-1973"));
		dbm.store(zatvorenikVucibatina);
		
		Zatvorenik zatvorenikBrljic = new Zatvorenik("Miro", "Brljić", "0912987321994", new Adresa(mjestoZagreb, "Trnjanska", "61"), "-");
		zatvorenikBrljic.setRodjen(datum("09-12-1987"));
		dbm.store(zatvorenikBrljic);
		
		Zatvorenik zatvorenikMrkic = new Zatvorenik("Mirko", "Mrkić", "1710971007007", new Adresa(mjestoZagreb, "Radnička", "20"), "-");
		zatvorenikMrkic.setRodjen(datum("17-10-1971"));
		dbm.store(zatvorenikMrkic);
		
		Zatvorenik zatvorenikKatic = new Zatvorenik("Vjeko", "Katić", "1206978662497", new Adresa(mjestoZagreb, "Ljubljanica", "34"), "-");
		zatvorenikKatic.setRodjen(datum("12-06-1978"));
		dbm.store(zatvorenikKatic);
		
		
	}
	
	private static Date datum(String datum){
		
		DateFormat dfm = new SimpleDateFormat("dd-MM-yyyy");
		dfm.setTimeZone(TimeZone.getTimeZone("Europe/Zurich"));
		try{
			return dfm.parse(datum);
		}
		catch(Exception e)
		{
			return new Date();
		}
	}
	
	
	@SuppressWarnings("unused")
	private static void loadDatabase(final DBManager dbm) {
		for(int i = 0; i < 100; i++)
			dbm.store(new Zatvorenik("Marko_" + String.valueOf(i+1), "MaruliÄ‡", "1231231234" + String.valueOf(i+1), 
				new Adresa(new Mjesto("MokoĹˇica", 20236+i), "IzmeÄ‘u dolaca", "13"), 
				new Date(788400000000L - 17280000000L*i), null, null, "ZATVOREN",
				24, new Date(), new Aktivnost("Nekakva aktivnost", 40, null), new ZatvorskoKrilo()));
		
		Mjesto lep = new Mjesto("Lepoglava", 42250);
		dbm.store(lep);
		Mjesto zg = new Mjesto("Zagreb", 10000);
		dbm.store(zg);
		Mjesto iv = new Mjesto("Ivanec", 42200);
		dbm.store(iv);
		Mjesto vz = new Mjesto("VaraĹľdin", 42000);
		dbm.store(vz);
		Mjesto bnj = new Mjesto("Bednja", 42253);
		dbm.store(bnj);
		
		Bolest aids = new Bolest(null, "AIDS", null);
		dbm.store(aids);
		Bolest gripa = new Bolest("Silapen", "Gripa", 7);
		dbm.store(gripa);
		Bolest ptsp = new Bolest("Prozac", "Posttraumatski stresni poremeÄ‡aj", null);
		dbm.store(ptsp);
		Bolest isijas = new Bolest("Deep Relief", "IĹˇijas", 300);
		dbm.store(isijas);
		
		Zatvorenik zat1 = new Zatvorenik("Marko", "MarkoviÄ‡", "0711976124981", new Adresa(lep, "VaraĹľdinska", "21"), "zatvoren");
		
		Zatvorenik zat2 = new Zatvorenik("Ivan", "IvankoviÄ‡", "1504981981772", new Adresa(zg, "Savska cesta", "111A"), "zatvoren");
		
		Adresa adr = new Adresa(vz, "TrakoĹˇÄ‡anska", "9");
		Zatvorenik zat3 = new Zatvorenik("Petar", "PetroviÄ‡", "0412959910032", adr, "slobodan");
		
		Cuvar cuv1 = new Cuvar("SiniĹˇa", "ÄŚuvariÄ‡", "1701979320065", new Adresa(bnj, "Izidora Poljaka", "11"));
		
		Cuvar cuv2 = new Cuvar("Stipe", "Stipalo", "2902960871087", new Adresa(iv, "Hrvatskih ivanovaca", "41b"));
		
		Doktor dok1 = new Doktor("Bojan", "Obojan", "0403966319971", new Adresa(vz, "BraÄ‡e RadiÄ‡", "15"), "OpÄ‡a praksa");
		
		Aktivnost drvodjelstvo = new Aktivnost("drvodjelstvo", 40, zat1);
		zat1.setRadniOdnos(drvodjelstvo);
		zat2.setRadniOdnos(drvodjelstvo);
		zat1.postaviDoktora(dok1);
		zat2.postaviDoktora(dok1);
		zat3.postaviDoktora(dok1);
		cuv1.postaviDoktora(dok1);
		cuv2.postaviDoktora(dok1);
		zat1.postaviDoktora(dok1);
		
		zat1.dodajOboljenje(isijas);
		zat1.dodajOboljenje(aids);
		zat2.dodajOboljenje(gripa);
		zat3.dodajOboljenje(gripa);
		zat3.dodajOboljenje(ptsp);
		zat3.dodajOboljenje(isijas);
		
		Kazna kaz1 = new ZatvorskaKazna(null, null, 1825);
		Ubojstvo uboj1 = new Ubojstvo(kaz1, "obradjeno", "zbog osvete", EOruzje.PISTOLJ, 1);
		zat1.dodajPrekrsaj(uboj1);
		
		Kazna kaz2 = new NovcanaKazna(1000, null);
		AlkoholiziranaVoznja alko = new AlkoholiziranaVoznja(adr, null, kaz2, "obradjeno", 2.01);
		Kazna kaz3 = new ZatvorskaKazna(null, null, 1000);
		Silovanje silov = new Silovanje(kaz3, "obradjeno", 22);
		zat2.dodajPrekrsaj(silov);
		zat2.dodajPrekrsaj(alko);
		
		Kazna kaz4 = new ZatvorskaKazna(null, null, 2190);
		Pljacka pljac = new Pljacka(kaz4, "obradjeno", 1000000, 1);
		Kazna kaz5 = new ZatvorskaKazna(null, null, 2190);
		Ubojstvo uboj2 = new Ubojstvo(kaz5, "obradjeno", "tokom pljaÄŤke", EOruzje.PUSKA, 1);
		zat3.dodajPrekrsaj(pljac);
		zat3.dodajPrekrsaj(uboj2);
		
		dbm.store(zat1);
		dbm.store(zat2);
		dbm.store(zat3);
		dbm.store(cuv1);
		dbm.store(cuv2);
		dbm.store(dok1);
		
	}

}
